from PySide2.QtWidgets import (QApplication, QMainWindow, QWidget, QStackedWidget,
                                QHBoxLayout, QVBoxLayout, QGridLayout, QDateEdit, QLabel,
                                QPushButton, QRadioButton, QButtonGroup)
from PySide2.QtCore import Qt, QDate
from PySide2.QtGui import QFont

class mywindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('多界面')
        self.setGeometry(300, 80, 750, 550)
        # 中央部件(主页面)
        central = self.main_page()
        self.setCentralWidget(central)
        

    def main_page(self):
        '''主页面: 左侧按钮栏,右侧堆叠窗口部件'''
        mainpage = QWidget()
        main_layout = QHBoxLayout(mainpage)
        # 左侧按钮栏
        btn_layout = QVBoxLayout()
        btn_layout.setAlignment(Qt.AlignTop)
        # 左侧按钮栏中的按钮创建
        btn_1 = QPushButton('btn 1')
        btn_2 = QPushButton('btn 2')
        self.left_btns = [btn_1, btn_2]
        # 按钮起始样式
        self.btn_origin_style = '''
            QPushButton {
                margin: 5px;
                padding: 15px;
                border: 1px solid black;
                border-radius: 5px;
                font-size: 18px;          
            }
        '''
        # 设置按钮样式，并添加到按钮栏布局中
        for btn in self.left_btns:
            btn.setStyleSheet(self.btn_origin_style)
            btn.setFixedWidth(150)
            btn.setCheckable(True)
            btn_layout.addWidget(btn)
        # 右侧堆叠窗口部件管理多个页面，一次只显示一个页面 
        self.stacked_widget = QStackedWidget()       
        # 各页面创建
        page_1 = self.create_page_1()
        page_2 = self.create_page_2()
        # 各页面添加到堆叠窗口部件中
        self.stacked_widget.addWidget(page_1)
        self.stacked_widget.addWidget(page_2)
        # 左侧按钮栏和堆叠窗口部件添加到主布局中
        main_layout.addLayout(btn_layout)
        main_layout.addWidget(self.stacked_widget)
        # 点击按钮，切换到对应页面，（连接按钮信号到槽函数）
        btn_1.clicked.connect(lambda: self.swap_page(0))
        btn_2.clicked.connect(lambda: self.swap_page(1))
        # 初始化第一个页面选中
        self.update_btn_status(0)
        return mainpage
        
    def swap_page(self, index):
        '''切换到指定页面'''
        self.stacked_widget.setCurrentIndex(index)
        self.update_btn_status(index)

    def update_btn_status(self, index):
        '''更新按钮栏中按钮点击状态'''
        btn_style = '''
            QPushButton {
                margin: 5px;
                padding: 15px;
                border: 1px solid black;
                border-radius: 5px;
                font-size: 18px;
                background-color: lightblue;
            }
        '''
        for i, btn in enumerate(self.left_btns):
            if i == index:
                btn.setChecked(True)
                btn.setStyleSheet(btn_style)
            else:
                btn.setChecked(False)
                btn.setStyleSheet(self.btn_origin_style)
            
    def create_page_1(self):
        '''创建页面1:日期选择器,标签显示日期'''
        page = QWidget()
        vlayout = QVBoxLayout(page)
        # 标签
        self.date_label = QLabel()
        self.date_label.setFont(QFont("Arial", 12))
        self.date_label.setText(f"当前日期是： {QDate.currentDate().toString('yyyy-MM-dd')}")
        # 日期选择器
        self.dateedit = QDateEdit()
        self.dateedit.setCalendarPopup(True)
        self.dateedit.setDate(QDate.currentDate())
        self.dateedit.setFixedWidth(200)
        self.dateedit.setFont(QFont("Arial", 12))
        self.dateedit.dateChanged.connect(self.showdate)    
        # 加入布局
        vlayout.addSpacing(10)
        vlayout.addWidget(self.date_label)
        vlayout.addSpacing(30)
        vlayout.addWidget(self.dateedit)
        vlayout.addStretch()
        return page

    def showdate(self):
        '''显示日期'''
        date = self.dateedit.date().toString('yyyy-MM-dd')
        self.date_label.setText(f'当前日期是： {date}')

    def create_page_2(self):
        '''创建页面2:单选按钮组,标签显示选择的内容'''
        page = QWidget()
        vlayout = QVBoxLayout(page)
        # 标签
        self.radio_label = QLabel()
        self.radio_label.setFont(QFont("Arial", 12))
        # 单选按钮组
        sports = ['跑步', '快走', '瑜伽', '游泳', '篮球','爬山', '网球', '乒乓球']
        gridlayout = QGridLayout()
        self.btngroup = QButtonGroup()
        self.btngroup.setExclusive(True)   # 确保互斥
        for i, sport in enumerate(sports):
            radio = QRadioButton(sport)
            radio.setFont(QFont('Arial', 12))
            self.btngroup.addButton(radio, id=i)
            gridlayout.addWidget(radio, i/3, i%3)
            # 默认第一个单选按钮选中
            if i == 0:
                radio.setChecked(True)
                self.radio_label.setText(f'当前选择的是： {sport}')
        self.btngroup.buttonClicked.connect(self.showchoice)        
        # 加入布局
        vlayout.addSpacing(10)
        vlayout.addWidget(self.radio_label)
        vlayout.addSpacing(30)
        vlayout.addLayout(gridlayout)
        vlayout.addStretch()
        return page

    def showchoice(self, option):
        '''单选按钮组选中时,标签显示选中内容'''
        self.radio_label.setText(f'当前选择的是： {option.text()}')


if __name__ == '__main__':
    app = QApplication()
    window = mywindow()
    window.show()
    app.exec_()